package com.ljs.spring_fastdfs.controller;

import com.ljs.spring_fastdfs.config.util.JsonResult;
import com.ljs.spring_fastdfs.config.util.UploadAndDownloadUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Controller
@Slf4j
public class FileController {
    //读取配置文件自定义的路径
    @Value("${myfile.staticAccessPath}")
    String staticAccessPath;
    @Value("${myfile.uploadFolder}")
    String uploadFolder;

    @RequestMapping("/toup")
    public String toup(){
        return "file";

    }
    @RequestMapping("/upload")//windows

    public String  upload(@RequestParam("fileName") MultipartFile file, HttpServletRequest request, Model model) throws IOException {
        //String filePath = "E:/images/"; // 上传到本地的路径 ,要加mvc的拦截器才能访问到物理路径的图片
        System.out.println("要上传的路径"+uploadFolder);
    String   fileName= UploadAndDownloadUtil.upload(file,uploadFolder);
  //String filename = "/img/" + fileName;//要在mvc拦截器配置路径。虚拟路径
        System.out.println("传到前端的文件名"+fileName);
        model.addAttribute("fileName", fileName);

        return "success";


    }
    @RequestMapping("/uploadll")//存放在服务器
    public String  uploadlinux(@RequestParam("fileName") MultipartFile file, HttpServletRequest request, Model model) throws IOException {
        /**
         * springboot获取项目的绝对路径和根目录
         * Harvey 5月前 ⋅ 11142 阅读
         *
         * springboot获取当前项目路径的地址
         *
         * System.getProperty("user.dir")
         *
         * 输出目录:  G:\outshine\wangsoso
         *
         * //获取classes目录绝对路径
         *
         * String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
         *
         * String path = ResourceUtils.getURL("classpath:").getPath();
         *
         * 输出目录:  /G:/outshine/wangsoso/target/classes/
         *
         * //如果上传目录为/static/images/upload/，则可以如下获取：
         * File upload = new File(path.getAbsolutePath(),"static/images/upload/");
         * if(!upload.exists()) upload.mkdirs();
         * System.out.println("upload url:"+upload.getAbsolutePath());
         * //在开发测试模式时，得到的地址为：{项目跟目录}/target/static/images/upload/
         * //在打包成jar正式发布时，得到的地址为：{发布jar包目录}/static/images/upload/
         *
         * 注意：以jar包发布项目时，我们存储的路径是与jar包同级的static目录，因此我们需要在jar包目录的application.properties配置文件中设置静态资源路径，如下所示：
         *
         * #设置静态资源路径，多个以逗号分隔
         *
         * spring.resources.static-locations=classpath:static/,file:static/
         *
         * 以jar包发布springboot项目时，默认会先使用jar包跟目录下的application.properties来作为项目配置文件。
         *
         * 如果在不同的目录中存在多个配置文件，它的读取顺序是：
         *
         *         1、config/application.properties（项目根目录中config目录下）
         *
         *         2、config/application.yml
         *
         *         3、application.properties（项目根目录下）
         *
         *         4、application.yml
         *
         *         5、resources/config/application.properties（项目resources目录中config目录下）
         *
         *         6、resources/config/application.yml
         *
         *         7、resources/application.properties（项目的resources目录下）
         *
         *         8、resources/application.yml
         *
         * 注：
         *
         *      1、如果同一个目录下，有application.yml也有application.properties，默认先读取application.properties。
         *
         *      2、如果同一个配置属性，在多个配置文件都配置了，默认使用第1个读取到的，后面读取的不覆盖前面读取到的。
         *
         *      3、创建SpringBoot项目时，一般的配置文件放置在“项目的resources目录下”
         */

        File imagePath;  //封面图片存放地址
        File rootPath = new File(ResourceUtils.getURL("classpath:").getPath());
        //获取相对路径
        if(!rootPath.exists()){
            rootPath = new File("");
        }
        imagePath = new File(rootPath.getAbsolutePath()+"/images");
        //判断文件夹是否存在
        if(!imagePath.exists()){
            //不存在，创建
            imagePath.mkdirs();
        }
        //获取文件名称
        String imageName = file.getOriginalFilename();

        //创建图片存放地址
        File imageResultPath = new File(imagePath+"/"+imageName);
        if(imageResultPath.exists()){
            log.warn("图片已经存在！");
            return "false！";
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        file.transferTo(imageResultPath);
        System.out.println("imagePath:"+imagePath);
        System.out.println("imageResultPath:"+imageResultPath.getCanonicalPath());
        model.addAttribute("fileName", imageResultPath.getCanonicalPath());
           String fileName="/img/"+imageName;
        //访问的名称，记住一定要配置mvc拦截器
        model.addAttribute("fileName", fileName);
        return "success";
    }
   @RequestMapping("/touploads")
   public  String uploads(){
        return "uploads";
   }
    @RequestMapping("/uploads")
    //多文件上传
    @ResponseBody
    public JsonResult uploads(@RequestParam("fileName") MultipartFile imgs[] , Model model){
        System.out.println("要上传的位置"+uploadFolder);

        JsonResult jsonResult=new JsonResult();
      List<String> files= UploadAndDownloadUtil.uploads(imgs,uploadFolder);
        System.out.println("文件路径有"+files);
//        model.addAttribute("files",files);//将图片路径传到页面
        jsonResult.setData(files);
        jsonResult.setMsg("ok");
        return  jsonResult ;//跳转到页面
    }

}
